#pragma once 
#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>
#include<assert.h>

#define Mode 0666
#define Path "./fifo"
using namespace std;
class Fifo
{
    public:
        Fifo(const string& path = Path)
        :_path(path)
        {
            umask(0);
            int n = mkfifo(_path.c_str(),Mode); //创建命名管道：本质就是创建文件文件
            if(n == 0)
            {
              cout<<"mkfifo success "<<endl;
            }
            else 
            {
              cerr<<"mkfifo failed, errno: " <<errno << ", string : "<<strerror(errno)<<std::endl;
            } 
        }
        ~Fifo()
        {
            int n = unlink(_path.c_str());
            if(n == 0)
            {
                cout << "remove fifo file " << _path << " success" << endl;
            }
            else 
            {
                cerr << "remove failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;
            }
        }
    private:
        string _path;//文件路径+文件名
};
class Sync
{
    public:
    Sync()
    :rfd(-1),wfd(-1)
    {}
    void OpenReadDir()
    {
        rfd = open(Path,O_RDONLY);
        if(rfd < 0)
            exit(0);
    }
    void OpenWriteDir()
    {
        wfd = open(Path,O_WRONLY);
        if(wfd < 0)
            exit(0);
    }
    bool Wait()
    {
        bool ret = true;
        uint32_t c = 0;
        ssize_t n = read(rfd, &c,sizeof(uint32_t));
        if(n == sizeof(uint32_t))
        {
            std::cout<<"server wakeup,begin read shm..." <<std::endl;
        }
        else if(n == 0)
        {
            ret = false;
        }
        else {
            return false;
        }
        return true;
    }
    void Wakeup()
    {
        uint32_t  c = 0;
        ssize_t n = write(wfd,&c,sizeof(c));
        assert(n == sizeof(c));
        std::cout<<"wakeup server ... "<<std::endl;
    }
    ~Sync()
    {}
    private:
    int rfd;
    int wfd;
};